home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
126-150
/
disk_147
/
sys
/
bsd
/
bsd.zoo
/
ttyio.c
< prev
Wrap
C/C++ Source or Header
|
1988-07-25
|
6KB
|
256 lines
/*
* Ultrix-32 and Unix terminal I/O.
* The functions in this file
* negotiate with the operating system for
* keyboard characters, and write characters to
* the display in a barely buffered fashion.
*/
#include "def.h"
#include <sgtty.h>
#define NOBUF 512 /* Output buffer size. */
char obuf[NOBUF]; /* Output buffer. */
int nobuf;
struct sgttyb oldtty; /* V6/V7 stty data. */
struct sgttyb newtty;
struct tchars oldtchars; /* V7 editing. */
struct tchars newtchars;
struct ltchars oldltchars; /* 4.2 BSD editing. */
struct ltchars newltchars;
#ifdef TIOCGWINSZ
struct winsize winsize; /* 4.3 BSD window sizing */
#endif
int nrow; /* Terminal size, rows. */
int ncol; /* Terminal size, columns. */
/*
* This function gets called once, to set up
* the terminal channel. On Ultrix is's tricky, since
* we want flow control, but we don't want any characters
* stolen to send signals. Use CBREAK mode, and set all
* characters but start and stop to 0xFF.
*/
ttopen() {
register char *tv_stype;
char *getenv(), *tgetstr(), tcbuf[1024], err_str[72];
char *sprintf();
/* do this the REAL way */
if ((tv_stype = getenv("TERM")) == NULL)
{
puts("Environment variable TERM not defined!");
exit(1);
}
if((tgetent(tcbuf, tv_stype)) != 1)
{
(void) sprintf(err_str, "Unknown terminal type %s!", tv_stype);
puts(err_str);
exit(1);
}
if (ttraw() == FALSE)
panic("aborting due to terminal initialize failure");
}
/*
* This function sets the terminal to RAW mode, as defined for the current
* shell. This is called both by ttopen() above and by spawncli() to
* get the current terminal settings and then change them to what
* mg expects. Thus, stty changes done while spawncli() is in effect
* will be reflected in mg.
*/
ttraw() {
extern short ospeed;
if (ioctl(0, TIOCGETP, (char *) &oldtty) < 0) {
ewprintf("ttopen can't get sgtty");
return(FALSE);
}
newtty.sg_ospeed = ospeed = oldtty.sg_ospeed;
newtty.sg_ispeed = oldtty.sg_ispeed;
newtty.sg_erase = oldtty.sg_erase;
newtty.sg_kill = oldtty.sg_kill;
newtty.sg_flags = oldtty.sg_flags;
newtty.sg_flags &= ~(ECHO|CRMOD); /* Kill echo, CR=>NL. */
#ifdef FLOWCONTROL
newtty.sg_flags |= CBREAK; /* Half-cooked mode. */
#else
newtty.sg_flags |= RAW|ANYP; /* raw mode for 8 bit path.*/
#endif
if (ioctl(0, TIOCSETP, (char *) &newtty) < 0) {
ewprintf("ttopen can't set sgtty");
return(FALSE);
}
if (ioctl(0, TIOCGETC, (char *) &oldtchars) < 0) {
ewprintf("ttopen can't get chars");
return(FALSE);
}
newtchars.t_intrc = 0xFF; /* Interrupt. */
newtchars.t_quitc = 0xFF; /* Quit. */
#if FLOWCONTROL
newtchars.t_startc = 0x11; /* ^Q, for terminal. */
newtchars.t_stopc = 0x13; /* ^S, for terminal. */
#else
newtchars.t_startc = 0xFF; /* ^Q, for terminal. */
newtchars.t_stopc = 0xFF; /* ^S, for terminal. */
#endif
newtchars.t_eofc = 0xFF;
newtchars.t_brkc = 0xFF;
if (ioctl(0, TIOCSETC, (char *) &newtchars) < 0) {
ewprintf("ttraw can't set chars");
return(FALSE);
}
if (ioctl(0, TIOCGLTC, (char *) &oldltchars) < 0) {
panic("ttraw can't get ltchars");
return(FALSE);
}
newltchars.t_suspc = 0xFF; /* Suspend #1. */
newltchars.t_dsuspc = 0xFF; /* Suspend #2. */
newltchars.t_rprntc = 0xFF;
newltchars.t_flushc = 0xFF; /* Output flush. */
newltchars.t_werasc = 0xFF;
newltchars.t_lnextc = 0xFF; /* Literal next. */
if (ioctl(0, TIOCSLTC, (char *) &newltchars) < 0) {
ewprintf("ttraw can't set ltchars");
return(FALSE);
}
setttysize() ;
return(TRUE);
}
/*
* This function gets called just
* before we go back home to the shell. Put all of
* the terminal parameters back.
* Under UN*X this just calls ttcooked(), but the ttclose() hook is in
* because vttidy() in display.c expects it for portability reasons.
*/
ttclose() {
if (ttcooked() == FALSE)
panic(""); /* ttcooked() already printf'd */
}
/*
* This function restores all terminal settings to their default values,
* in anticipation of exiting or suspending the editor.
*/
ttcooked() {
ttflush();
if (ioctl(0, TIOCSLTC, (char *) &oldltchars) < 0) {
ewprintf("ttclose can't set ltchars");
return(FALSE);
}
if (ioctl(0, TIOCSETC, (char *) &oldtchars) < 0) {
ewprintf("ttclose can't set chars");
return(FALSE);
}
if (ioctl(0, TIOCSETP, (char *) &oldtty) < 0) {
ewprintf("ttclose can't set sgtty");
return(FALSE);
}
return(TRUE);
}
/*
* Write character to the display.
* Characters are buffered up, to make things
* a little bit more efficient.
*/
ttputc(c)
int c;
{
if (nobuf >= NOBUF)
ttflush();
obuf[nobuf++] = c;
}
/*
* Flush output.
*/
ttflush() {
if (nobuf != 0) {
if (write(1, obuf, nobuf) != nobuf)
panic("ttflush write failed");
nobuf = 0;
}
}
/*
* Read character from terminal.
* All 8 bits are returned, so that you can use
* a multi-national terminal.
*/
ttgetc() {
char buf[1];
while (read(0, &buf[0], 1) != 1)
;
return (buf[0] & 0xFF);
}
/*
* set the tty size. Functionized for 43BSD.
*/
setttysize() {
#ifdef TIOCGWINSZ
if (ioctl(0, TIOCGWINSZ, (char *) &winsize) == 0) {
nrow = winsize . ws_row;
ncol = winsize . ws_col;
} else nrow = 0;
if(nrow<=0 || ncol<=0)
#endif
if ((nrow=tgetnum ("li")) <= 0
|| (ncol=tgetnum ("co")) <= 0) {
nrow = 24;
ncol = 80;
}
if (nrow > NROW) /* Don't crash if the */
nrow = NROW; /* termcap entry is */
if (ncol > NCOL) /* too big. */
ncol = NCOL;
}
/*
* typeahead returns TRUE if there are characters available to be read
* in.
*/
typeahead() {
int x;
return((ioctl(0, FIONREAD, (char *) &x) < 0) ? 0 : x);
}
/*
* panic - just exit, as quickly as we can.
*/
panic(s) char *s; {
(void) fputs("panic: ", stderr);
(void) fputs(s, stderr);
(void) fputc('\n', stderr);
(void) fflush(stderr);
abort(); /* To leave a core image. */
}
#ifndef NO_DPROMPT
#include <sys/time.h>
/*
* A program to return TRUE if we wait for 2 seconds without anything
* happening, else return FALSE. Cribbed from mod.sources xmodem.
*/
int ttwait() {
int readfd;
struct timeval tmout;
tmout.tv_sec = 2;
tmout.tv_usec = 0;
readfd = 1;
if ((select(1, &readfd, (int *)0, (int *)0, &tmout)) == 0)
return(TRUE);
return(FALSE);
}
#endif